char
----
最基本(定长)的字符串类型!
用于保存,长度固定的内容!
速度快,但是保存变长数据,会浪费空间!
varchar
-------
可变长度的字符串!
用于保存长度可变的数据!
保存变长数据时,节省空间,处理起来麻烦些!
char(L),varchar(L)
L,表示每个数据的最大长度!单位是 字符数(不是字节数)

L 表示最大长度!
L的值不是多大都可以!
有最大值:
1,mysql一条记录最大不能超过65535个字节!(字段的长度加起来,不能超过这个值)
2,长度单位是字符数,与编码是相关的!

采用单字节编码测试下:
Latin1

测试发现只有一个字段,而且是单字节字符集,还是不能是65535,原因是?

为什么是 65532呢,少了三个字节:
3,由于varchar是变长,需要记录下真实的数据到底有多长!每个varchar类型的数据,还需要额外的1个或2个字节保存真实数据的长度!(取决于真实数据的长度)
4,整条记录,还需要一个字节来保存那些字段为null

但是,在使用时,varchar 超过255就选择 text来保存!
text
----
文本,不限长度的字符串!
该字段,不需要指定长度,而且也不会算入到记录的总长度内!

选择
定长,char
变长较短(255)个字符之内,varchar
变长,较长,text
枚举,enum,单选
----------
需要在定义枚举类型时,列出哪些是可能的!

在处理时,类似 字符串型进行操作!
意义在于:
1, 限定值的可能性!

2, 速度快,比普通的字符串速度快!
原因是 枚举型 是利用 整数进行管理的,能够2个字节进行管理!

每个值,都是一个整数标识,从第一个选项开始为1, 逐一递增!
管理时整数的形式,速度比字符串快!

2 个字节,0-65535,因此可以有 65535个选项可以使用!
集合,set,复选
---------
类似于 enum枚举,在定义时,也需要指定其已有值!

与字符串相比,优势是:
1, 也是采用 整数进行管理的!采用位运算,从第一位开始为1,逐一x2!

2, 每个集合类型8个字节,64位,因此可以表示64个元素!
注意:站在 mysql的角度,尽量多用 枚举和集合!
但是站在php操作mysql的角度,尽量少用!(兼容性差)